// 1.2.1.数组-相关-多维数组
/**
 * C++ 支持数组数据结构，它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据，但它往往被认为是一系列相同类型的变量。
 * 数组的声明并不是声明一个个单独的变量，比如 number0、number1、...、number99，而是声明一个数组变量，比如 numbers，然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
 * 所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素，最高的地址对应最后一个元素。
 * -----------------
 * 相关
 * 
 * 在 C++ 中，数组是非常重要的，我们需要了解更多有关数组的细节。下面列出了 C++ 程序员必须清楚的一些与数组相关的重要概念
 * 1.多维数组
 *  C++ 支持多维数组。多维数组最简单的形式是二维数组。
 * 2.指向数组的指针
 *  您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。
 * 3.传递数组给函数
 *  您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
 * 4.从函数返回数组
 *  C++ 允许从函数返回数组。
 * 
 * ~~~~~~~~~~~~~~~~~~
 * 多维数组
 * C++ 支持多维数组。多维数组声明的一般形式如下：
 *  type name[size1][size2]...[sizeN];
 * 例如，下面的声明创建了一个三维 5 . 10 . 4 整型数组：
 *  int threedim[5][10][4];
 * 
 * 二维数组
 * 多维数组最简单的形式是二维数组。一个二维数组，在本质上，是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组，形式如下：
 *  type arrayName [ x ][ y ];
 * 其中，type 可以是任意有效的 C++ 数据类型，arrayName 是一个有效的 C++ 标识符。
 * 
 * 一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组，包含 3 行和 4 列：
 *          Column 0   Column 1   Column 2   Column 3
 * Row 0    a[0][0]    a[0][1]    a[0][2]    a[0][3]
 * Row 1    a[1][0]    a[1][1]    a[1][2]    a[1][3]
 * Row 2    a[2][0]    a[2][1]    a[2][2]    a[2][3]
 * 
 * 因此，数组中的每个元素是使用形式为 a[ i , j ] 的元素名称来标识的，其中 a 是数组名称，i 和 j 是唯一标识 a 中每个元素的下标。
 * 
 * 初始化二维数组
 * 多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。
 *  int a[3][4] = {  
     {0, 1, 2, 3} ,   //  初始化索引号为 0 的行
     {4, 5, 6, 7} ,   //  初始化索引号为 1 的行
     {8, 9, 10, 11}   //  初始化索引号为 2 的行
    };

  *
  *
  * 内部嵌套的括号是可选的，下面的初始化与上面是等同的：
  *   int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
  *
  *
  * 访问二维数组元素
  * 二维数组中的元素是通过使用下标（即数组的行索引和列索引）来访问的。例如：
  *   int val = a[2][3];
  *上面的语句将获取数组中第 3 行第 4 个元素。您可以通过上面的示意图来进行验证。让我们来看看下面的程序，我们将使用嵌套循环来处理二维数组：
*/

#include <iostream>
#include <iomanip>

int main(void)
{
  // int arr[5][10][4];

  // int arr[5][2] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}};
  int arr[][2] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}};

  for (int i = 0; i < 5; i++)
  {
    for (int j = 0; j < 2; j++)
    {
      std::cout << "arr[" << i << "][" << j << "]："
                << arr[i][j] << std::endl;
    }
  }

  // char *arr1[4][3][2] = {
  //     {{"000", "001"},
  //      {"010", "011"},
  //      {"020", "021"}},
  //     {{"100", "101"},
  //      {"110", "111"},
  //      {"120", "121"}},
  //     {{"200", "201"},
  //      {"210", "211"},
  //      {"220", "221"}},
  //     {{"300", "301"},
  //      {"310", "311"},
  //      {"320", "321"}}};

  // 内部的括号可选的
  char *arr1[][3][2] = {
      "000", "001",
      "010", "011",
      "020", "021",

      "100", "101",
      "110", "111",
      "120", "121",

      "200", "201",
      "210", "211",
      "220", "221",

      "300", "301",
      "310", "311",
      "320", "321"};
  for (int i = 0; i < 4; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      for (int k = 0; k < 2; k++)
      {
        std::cout << "i,j,k : " << i << " " << j << " " << k << " : " << arr1[i][j][k] << std::endl;
      }
    }
  }
  printf("------------end--------------\n");
  return 0;
}